package com.itheima;


import com.itheima.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * constructor构造器注入：
 * 首先使用的是构造方法，不是setter方法
 * 1.引用数据类型
 * 在bean的类中先声明出引用对象，
 * 接着生成这几个参数的有些参构造方法
 * 接着在配置类中配置，方法类似，但是用的是<constructor-arg/>标签
 *
 *
 * 强制依赖使用构造器进行，使用setter注入有概率不进行注入导致nu11对象出现
 * 1.
 * 可选依赖使用setter注入进行，灵活性强
 * 2 .
 * Spring框架倡导使用构造器，第三方框架内部大多数采用构造器注入的形式进行数据初始化，相对严谨
 * 3 .
 * 如果有必要可以两者同时使用，使用构造器注入完成强制依赖的注入，使用setter注入完成可选依赖的注入
 * 4
 * 实际开发过程中还要根据实际情况分析，如果受控对象没有提供setter方法就必须使用构造器注入
 * 自己开发的模块推荐使用setter注入
 * 6.
 * 所以说强制依赖使用构造器注入
 */
public class AppForDiConstructor {

    public static void main(String[] args) {
        ApplicationContext cx = new ClassPathXmlApplicationContext("applicationContext.xml");

        BookService bookService = (BookService) cx.getBean("bookService");

        bookService.save();
    }

}
